package com.zxjbyte.yiyi.framework.common.core;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.zxjbyte.yiyi.framework.common.constant.StringPool;

import java.time.Duration;

/**
 * @Author zhangxingjia
 * @Date 2023/4/3 13:52
 * @Version: 1.0
 */
public interface IRedisKey {

    /**
     * 获取前缀
     *
     * @return key 前缀
     */
    String getPrefix();

    /**
     * 获取最后后缀
     * @return
     */
    default String getLastSuffix(){
        return StringPool.EMPTY;
    }

    /**
     * 组装 cache key
     *
     * @param suffix 参数
     * @return cache key
     */
    default CacheKey buildCacheKey(Object... suffix) {
        return buildCacheKey(null, suffix);
    }

    /**
     * 组装 cache key
     *
     * @param expire 超时时间
     * @param suffix 参数
     * @return cache key
     */
    default CacheKey buildCacheKey(Duration expire, Object... suffix) {
        // 拼接参数
        String key = buildStrKey(suffix);
        return expire == null ? new CacheKey(key) : new CacheKey(key, expire);
    }

    /**
     * 组装 key
     *
     * @param suffix 参数
     * @return cache key
     */
    default String buildStrKey(Object... suffix) {
        String prefix = getPrefix();
        String lastSuffix = getLastSuffix();
        // 拼接参数
        String key;
        if (ObjectUtil.isEmpty(suffix)) {
            key = prefix.concat(lastSuffix);
        } else {
            key = prefix.concat(StringPool.COLON).concat(StrUtil.join(StringPool.COLON, suffix)).concat(lastSuffix);
        }
        return key;
    }
}
